﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Entity;
using System.Web;
using IQReportes.ViewModels;

namespace IQReportes.Models.Logica
{
    /// <summary>
    /// lógica de módulo
    /// </summary>
    public class LogicaModulo
    {
        /// <summary>
        /// objeto de acceso a bd para la tabla relacionada a variables generales
        /// </summary>
        GlobalDbContext db = new GlobalDbContext();
        /// <summary>
        /// obtener nueva lista de permisos sobre módulos
        /// </summary>
        /// <param name="tipo">tipo de vista (transacciones o panel de control)</param>
        /// <returns>lista de permisos sobre módulos</returns>
        public List<ModuloInfoViewModel> getNuevaLista(int tipo)
        {
            List<ModuloInfoViewModel> modulos = new List<ModuloInfoViewModel>();

            var dbModulos = db.modulos.Where(x=>x.inTipo == tipo).ToList();

            foreach (Modulo item in dbModulos)
            {
                bool ver = false;
                bool descargar = false;
                if (item.inNumModulo == 1) ver = true;
                modulos.Add(new ModuloInfoViewModel(item,ver,descargar));
            }
            return modulos;
        }
        /// <summary>
        /// obtener nombre del módulo a partir del id
        /// </summary>
        /// <param name="id">id del módulo</param>
        /// <returns>nombre del módulo</returns>
        public string getNombreModuloById(int id)
        {
            return (from item in db.modulos where item.idModulo == id select item.vcNombre).First();
        }
        /// <summary>
        /// obtener lista de módulos
        /// </summary>
        /// <param name="id">id de perfil</param>
        /// <param name="tipo">tipo de vista (transacciones o panel de control)</param>
        /// <returns></returns>
        public List<ModuloInfoViewModel> getListaByIdAndTipo(int id, int tipo)
        {
            List<ModuloInfoViewModel> modulos = new List<ModuloInfoViewModel>();
            var dbModulos = (from item in db.perfilesXModulos.Include(x=>x.modulo)
                            where item.idPerfil == id && item.modulo.inTipo==tipo
                            select item).ToList();
            foreach (PerfilXModulo m in dbModulos)
            {
                modulos.Add(new ModuloInfoViewModel(m));
            }
            return modulos;
        }
        /// <summary>
        /// obtener lista de módulos
        /// </summary>
        /// <param name="idUsuario">id usuario</param>
        /// <param name="tipo">tipo de vista (transacciones o panel de control)</param>
        /// <returns>lista de módulos</returns>
        public List<ModuloInfoViewModel> getListConfiguracionById(int idUsuario, int tipo)
        {
            int idPerfil = db.usuarios.Where(x => x.idUsuario == idUsuario).Select(x => x.idPerfil).First();
            var dbModulos = (from item in db.usuariosXModulos.Include(x => x.modulo)
                             where item.idUsuario == idUsuario && item.modulo.inTipo == tipo
                             select item).ToList();
            List<ModuloInfoViewModel> modulos = getListaByIdAndTipo(idPerfil, tipo);
            for (int i = 0; i < modulos.Count;i++ )
            {
                
                modulos[i].tipoChart = dbModulos[i].inTipoChart;
                
            }

            return modulos;
        }
        /// <summary>
        /// crear nuevos módulos para un usuario
        /// </summary>
        /// <param name="usuarioId">id del usuario</param>
        public void crearModulosXUsuario(int usuarioId)
        {
            UsuarioXModulo usuarioXModulo;
            foreach (var m in db.modulos.ToList())
            {
                usuarioXModulo = new UsuarioXModulo { idModulo=m.idModulo,
                                idUsuario=usuarioId,inTipoChart=m.inTipoChart};
                db.usuariosXModulos.Add(usuarioXModulo);
            }
            db.SaveChanges();
        }
        /// <summary>
        /// crear módulosXPerfil para un perfil 
        /// </summary>
        /// <param name="nuevoPerfil">nuevo perfil</param>
        /// <param name="modulos">módulos</param>
        /// <param name="tipo">tipo de vista (transacciones o panel de control)</param>
        public void crearModulosXPerfil(Perfil nuevoPerfil, List<ModuloInfoViewModel> modulos, int tipo)
        {
            PerfilXModulo perfilXModulo;
            for ( int i = 0;i< modulos.Count;i++)
            {
                perfilXModulo = modulos[i].extractPXM(nuevoPerfil);
                db.perfilesXModulos.Add(perfilXModulo);   
            }
            db.SaveChanges();
        }
        /// <summary>
        /// actualizar datos de módulosXPerfil
        /// </summary>
        /// <param name="nuevoPerfil">nuevo perfil</param>
        /// <param name="modulos">módulos</param>
        public void actualizarModulosXPerfil(Perfil nuevoPerfil, List<ModuloInfoViewModel> modulos){
            PerfilXModulo perfilXModulo;
            for ( int i = 0;i< modulos.Count;i++)
            {   int idModulo = Int32.Parse(modulos[i].id);
                perfilXModulo = (from item in db.perfilesXModulos
                                 where item.idModulo == idModulo
                                 && item.idPerfil == nuevoPerfil.idPerfil
                                 select item).First();
                perfilXModulo.bDescargar = modulos[i].descargar;
                perfilXModulo.bVer = modulos[i].ver;
                db.Entry(perfilXModulo).State = System.Data.EntityState.Modified;
            }    
            db.SaveChanges();
        }
        /// <summary>
        /// eliminar módulos del usuario seleccionado
        /// </summary>
        /// <param name="idUsuario">id del usuario</param>
        public void eliminarModulosXUsuario(int idUsuario)
        {
            var eliminados = (from item in db.usuariosXModulos
                              where item.idUsuario == idUsuario
                              select item).ToList();
            foreach (var item in eliminados)
            {
                db.usuariosXModulos.Remove(item);
            }
            db.SaveChanges();
        }
        /// <summary>
        /// eliminar módulos del perfil seleccionado
        /// </summary>
        /// <param name="perfil">perfil selecionado</param>
        public void eliminarModulosXPerfil(Perfil perfil)
        {
            var eliminados = (from item in db.perfilesXModulos
                                where item.idPerfil == perfil.idPerfil
                                  select item).ToList();
            foreach(var item in eliminados){
                db.perfilesXModulos.Remove(item);
            }
            db.SaveChanges();
        }
        /// <summary>
        /// actualizar información de los módulos del usuario
        /// </summary>
        /// <param name="modulos">módulos a actualizar</param>
        /// <param name="usuarioId">id del usuario</param>
        public void actualizarModulos ( List<ModuloInfoViewModel> modulos , string usuarioId){
            int idUsuario = Int32.Parse(usuarioId);
            foreach (var item in modulos ){
                db.Entry(item.extract(idUsuario)).State = System.Data.EntityState.Modified;
            }
            db.SaveChanges();
        }
        /// <summary>
        /// actualizar módulos del usuario
        /// </summary>
        /// <param name="usuario">usuario</param>
        public void actualizarModulosXUsuarioConf(UsuarioViewModel usuario)
        {
            usuario.modulosTx[0].tipoChart = usuario.modulosTx[0].valorTree;
            actualizarModulos(usuario.modulosTx,usuario.id);
            actualizarModulos(usuario.modulosPC,usuario.id);
        }
    }
}